#include "querywidget.h"
#include "ui_querywidget.h"

QueryWidget::QueryWidget(QWidget *parent) :
    BaseEditor(parent),
    ui(new Ui::QueryWidget)
{
    ui->setupUi(this);

    editDialog=nullptr;
    queryModel=new QSqlQueryModel(this);
    ui->tableView->setModel(queryModel);
    createMenu();
}

QueryWidget::~QueryWidget()
{
    delete ui;
}

void QueryWidget::setConnection(const QString &connectionName)
{
    if(db.connectionName() == connectionName)
        return;

    if(QSqlDatabase::contains(connectionName))
    {
        db=QSqlDatabase::database(connectionName);
    }
}

void QueryWidget::prepareStatement(const QMap<QString, QString> &map)
{
    statements=map;
    if(!ui->in_code->text().isEmpty())
        ui->in_code->clear();
    if(!ui->in_name->text().isEmpty())
        ui->in_name->clear();
    updateView();
    updateMenu();
}

void QueryWidget::generateMenu()
{
    menu->addAction("更新视图 (F5)",this,&QueryWidget::updateView);
}

void QueryWidget::updateMenu()
{
    if(!menu->isEmpty())
        menu->clear();

    generateMenu();

    if(statements.contains("update"))
    {
        menu->addSeparator();
        menu->addAction("单据修改...",this,&QueryWidget::editItem);
    }
}

void QueryWidget::editItem()
{
    if(editDialog == nullptr)
    {
        editDialog=new EditDialog(db,this);
        connect(editDialog,&EditDialog::transferLog,this,&QueryWidget::transferLog);
        editDialog->move(this->parentWidget()->x() + 400,
                         this->parentWidget()->y() + 100);
    }
    editDialog->prepareStatement(statements);

    if(!editDialog->isVisible())
        editDialog->show();
}

void QueryWidget::keyPressEvent(QKeyEvent *event)
{
    switch (event->key()) {
    case Qt::Key_F5:
        updateView();
        break;
    }
}

void QueryWidget::query(const QString &sql,const QString &kw)
{
    if(sql.isEmpty() || !db.isValid())
    {
        transferLog("无法连接数据库");
        return;
    }

    transferLog(QString("[%1] %2")
                .arg(kw).arg(sql));
    queryModel->setQuery(sql,db);
    setHeaderData();
}

void QueryWidget::updateView()
{
    if(statements.contains("query"))
    {
        QString sql=statements.value("query");
        query(sql,"query");
    }
}

void QueryWidget::setHeaderData()
{
    auto column=statements.value("columns");
    auto items=column.split("，");
    for (int i = 0; i < items.size(); i++) {
        queryModel->setHeaderData(i,Qt::Horizontal,items.at(i));
    }
    if(queryModel->rowCount() > 0)
        ui->tableView->resizeColumnsToContents();
}

void QueryWidget::on_tableView_doubleClicked(const QModelIndex &index)
{
    if(index.isValid())
    {
        QString item=index.data().toString();
        if(item.isEmpty())
            return;

        qApp->clipboard()->setText(item);
        showMessage(item + " 已复制到粘贴板");
    }
}

void QueryWidget::on_in_code_returnPressed()
{
    auto input=ui->in_code->text().trimmed();
    if(input.isEmpty() || statements.isEmpty())
        return;

    if(statements.contains("queryByCode"))
    {
        QString sql=statements.value("queryByCode").arg(input);
        query(sql,"queryByCode");
    }
    else
        showMessage("当前功能缺失或者不提供该功能[queryByCode]");
}

void QueryWidget::on_in_name_returnPressed()
{
    auto input=ui->in_name->text().trimmed();
    if(input.isEmpty() || statements.isEmpty())
        return;

    if(statements.contains("queryByName"))
    {
        QString sql=statements.value("queryByName").arg(input);
        query(sql,"queryByName");
    }
    else
        showMessage("当前功能缺失或者不提供该功能[queryByName]");
}

void QueryWidget::on_btn_codeClear_clicked()
{
    ui->in_code->clear();
}

void QueryWidget::on_btn_nameClear_clicked()
{
    ui->in_name->clear();
}
